


// 引入
const { request } = require('express');
// 创建应用对象
const express = require('express');
// 创建应用对象
const app = express();

// 解决跨域问题
app.all("*",function(req,res,next){
    // 设置允许跨域的域名,*代表允许任意域名跨域
    res.header('Access-Control-Allow-Origin','*');
    // 允许的header类型
    res.header('Access-Control-Allow-Headers','content-type');
    // 跨域允许的请求方式
    res.header('Access-Control-Allow-Methods','DELETE,PUT,POST,GET,OPTIONS');
    if(req.method.toLowerCase() == 'options')
        res.send(20000); // 让options 尝试请求快速结束
    else
        next();
})

const fs = require("fs")
const path = require("path")
const moment = require("moment")


// 读取文件
app.get('/',(request,response) => {
    // response.send('hello express~');
	
	// node启动命令参数
	// const arguments = process.argv
	// 支持命令行输入参数选择文件
	//const fileName = request.filePath || `C:/kaibang/mes/weigh/test.txt`
	let fileName = request.query.filePath 
	// 读取txt文件
	fs.readFile(fileName, 'utf-8', (err, data) => {
		if (err) {
			console.log(err)
			response.send(err);
		}else{
			console.log(data)
			response.send(data);
		}
				
	})
});

// 写入文件
app.get('/write',(request,response) => {
    // response.send('hello express~');

	// node启动命令参数
	// const arguments = process.argv
	// 支持命令行输入参数选择文件
	//const fileName = request.filePath || `C:/kaibang/mes/weigh/test.txt`
    let fileName = request.query.filePath 
    // [2022-09-06 14:38:52] +19300.0 g
    // 获取日期
    let writeTxt = '[' + getTimeNow() + '] + ' + random(3) + ' g'
    let resData = writeTxt
    // 读取txt文件
	fs.readFile(fileName, 'utf-8', (err, data) => {
		if (err) {
			console.log(err)
			response.send(err);
        } else {
            writeTxt = data?data + "\r\n" + writeTxt:writeTxt
			fs.writeFile(fileName, writeTxt ,err => {
                if (err) {
                    response.send(err);
                }else{
                    response.send({
                        code: 200,
                        msg: '写入成功',
                        data: resData
                    });
                }
            })
			
		}
				
	})
    
});


// 复制文件
app.get('/copy', (request, response) => {
    let fileName = request.query.filePath 
    let accessFileName = `./weighing-history-${getDayNow()}.txt`
    fs.readFile(fileName, 'utf-8', (err, data) => {  // 读取文件
        if (err) {
            response.send(err);
        } else {
            fs.writeFile(accessFileName, data ,err => { // 向备份文件写入读取文件内容
                if (err) {
                    response.send(err);
                }else{
                    response.send({
                        code: 200,
                        msg: '复制成功',
                        data: accessFileName
                    });
                }
            })
            // 原文件清空
            fs.writeFile(fileName, '' ,err => {
                console.log(err)
            })
            
        }
                
    })
});

// 定时任务
const schedule = require('node-schedule');
// 每小时的 第42分钟 执行一个任务 注意是5个星号（最多可有6个星号，从左到右分别代表：秒（0-59）、分（0-59）、时（0-23）、天（1-31）、月（1-12）、星期几（0-7 0和7代表周日））
// 每天的23点58分58秒触发 ：'58 58 23 * * *'
const job = schedule.scheduleJob('58 58 23 * * *', function () {
    let fileName = `C:/kaibang/mes/weigh/weighing-history.txt`
    let accessFileName = `./weighing-history-${getDayNow()}.txt`
    fs.readFile(fileName, 'utf-8', (err, data) => {  // 读取文件
        if (err) {
            console.log(err)
        } else {
            fs.writeFile(accessFileName, data ,err => { // 向备份文件写入读取文件内容
                console.log(err)
            })
            fs.writeFile(fileName, '' ,err => { // 原文件清空
                console.log(err)
            })
        }
    })

    // 删除一个月前的文件
    fs.access('weighing-history-'+moment().subtract(1, 'months').format('YYYY-MM-DD')+'.txt', function (err) {
        if (err) {
            console.log(err)
        }else{
            fs.unlinkSync('weighing-history-'+moment().subtract(1, 'months').format('YYYY-MM-DD')+'.txt');
            console.log('删除一个月前数据成功=>'+'weighing-history-'+moment().subtract(1, 'months').format('YYYY-MM-DD')+'.txt')
        }
    })
  });



// 监听端口启动服务
app.listen(8000,() => {
    console.log("服务已启动，8000端口监听中...");
})



// 随机数
function random(length) {
    return parseInt(Math.random() * 10);
}

// 获取时间
function getTimeNow() {
    var date = new Date()
    var Y = date.getFullYear() + '-'
    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
    var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '
    var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
    var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'
    var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds())
    return Y + M + D + h + m + s
}

// 获取日期
function getDayNow() {
    var date = new Date()
    var Y = date.getFullYear() + '-'
    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
    var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate())
    return Y + M + D
}



// 监听 COM 串口


const { SerialPort } = require('serialport');
const sp = new SerialPort({ path: 'COM10', baudRate: 19200 });


// 监听串口
// (async () => {
//     try {
//         setInterval(async () => {
//             let ports = await SerialPort.list();
//             // console.log(ports); // 打印串口列表
//             let port = ports.find(item => (item.path == 'COM2'))
            
//             if (port) {
//                 console.log(port.path)
//             } else {
//                 console.log('com2串口关闭了')
//             }
//         },3000)
//     } catch (error) {
//         console.log(error);
//     }
// })();

// 以 paused mode 监听收到的数据，需要主动读取数据
// sp.on('readable', () => {
//     console.log(1)
//     sp.read()
// });
// 错误处理
sp.on('error', err => {
    console.log('error => '+err);
});

// 以 flowing mode 监听收到的数据
let str="", timer=null;
sp.on('data', (data) => {
    str += data.toString();
    let state = str.indexOf('+') > -1 && str.indexOf('g') > -1; // 判断数据格式是否正确 （包含 + 和 g）
    console.log(state)
    console.log(str)
    if(state){
        //数据接收完全了，下面可以对数据进行解析，一般只需对正文进行装换，类    型进行判断
        clearTimeout(timer);
        writeFile(str)
    } else {
        //防止其他的非标准格式影响，做清空处理
        clearTimeout(timer);
        timer=setTimeout(()=>{
            str=""
        },200)
    }
});

function writeFile (val) { 
    const fileName = `C:/kaibang/mes/weigh/weighing-history.txt`  // 写入文件地址
    fs.readFile(fileName, 'utf-8', (err, file) => {
		if (err) {
			console.log(err)
        } else {
            let writeTxt = '[' + getTimeNow() + '] ' + val
            writeTxt = file + "\r\n" + writeTxt
            str = ''
            fs.writeFile(fileName, writeTxt, err => {
                if(err) {
                    return console.log(err);
                }
                // console.log("File saved successfully! =>  " + writeTxt);
            })
			
		}
				
	})
}
